package com.zhouyong.protocol;

import com.alibaba.fastjson2.JSONObject;
import lombok.extern.slf4j.Slf4j;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

/**
 * 序列化实现的方式，可以进行扩展
 */
@Slf4j
public enum ObjectSerialEnum implements ObjectSerial {

    /**
     * jdk方式
     */
    JDK {
        @Override
        public <T> byte[] serialize(T obj) {
            log.info("使用jdk方式进行序列化...");
            try {
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                ObjectOutputStream oos = new ObjectOutputStream(bos);
                oos.writeObject(obj);
                return bos.toByteArray();
            } catch (Exception e) {
                log.error("jdk序列化异常, cause: {}", e);
            }
            return null;
        }

        @Override
        public <T> Object deserialize(Class<T> clazz, byte[] bytes) {
            log.info("使用jdk方式进行反序列化...");
            try {
                ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
                ObjectInputStream ois = new ObjectInputStream(bis);
                return ois.readObject();
            } catch (Exception e) {
                log.error("jdk反序列化异常，cause: {}", e.getMessage());
            }
            return null;
        }
    },

    /**
     * fastjson方式
     */
    FASTJSON {
        @Override
        public <T> byte[] serialize(T obj) {
            log.info("使用fastJson方式进行序列化...");
            try {
                return JSONObject.toJSONString(obj).getBytes();
            } catch (Exception e) {
                log.error("fastjson序列化异常");
            }
            return null;
        }

        @Override
        public <T> Object deserialize(Class<T> clazz, byte[] bytes) {
            log.info("使用fastJson方式进行反序列化...");
            try {
                return JSONObject.parseObject(new String(bytes), clazz);
            } catch (Exception e) {
                log.error("fastjson反序列化异常");
            }
            return null;
        }
    }
}
